iT邦幫忙

2017 iT 邦幫忙鐵人賽
DAY 15
0
自我挑戰組

Git學習筆記系列 第 15

git cherry-pick

  • 分享至 

  • xImage
  •  

今天要介紹的是cherry-pick指令

假設我們在branch cr1 上開發了好幾個功能,

結果客戶表示某些 cr1 內的功能要上線,其他的不上

所以要包一個測試的版本給客戶的話,要如何產生客戶想要的版本呢?

cherry-pick指令 應該就是我們要找的指令了

我們從master 開一個branch cr1

​$ git checkout -b cr1                                    
Switched to a new branch 'cr1'

在cr1上面改了4個cmooit,如下所示有4個div分別顯示cr1-1到cr1-4

每加一個 cr1-X 就commit一版

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width">
    <title>My Page</title>
</head>
<body>
    <h1>momo's page lala edit</h1>
    <div>learning git</div>
    <div>change remote url</div>
    <div>prepare</div>
    <div>use the rebase</div>
    <div>deBug deBug deBug</div>
    <div>cr1-1</div>
    <div>cr1-2</div>
    <div>cr1-3</div>
    <div>cr1-4</div>
</body>
</html>

此時cr1上面的線圖如下

Imgur

這時候客戶說下次上線要測試的版本是只要上cr1-1,cr1-3的版本

這時候我們的範例最後的結果應該會是一個只有cr1-1,cr1-3出現在index.html內的版本

我們先在分支cr1上用git log來檢視commit的hash id為何

​$ git log --pretty=format:"%h %s" 

9a7345e cr1-4
fb808b6 cr1-3
e33aa75 cr1-2
0cb1ee7 cr1-1

接著切回master

這時候就可以從master 下指令了

不過我的習慣會是回到master後 會從剛才建立cr1的commit來建立一個uat或是test的分支

切換到該uat分支,先將cr1-1取出

 $ git cherry-pick 0cb1ee7
[uat 34e6995] cr1-1
 Date: Thu Dec 29 23:47:35 2016 +0800
 1 file changed, 1 insertion(+)

此時分支uat線圖如下

Imgur

接下來將cr1-3撿回來

​$ git cherry-pick fb808b6
error: could not apply fb808b6... cr1-3
hint: after resolving the conflicts, mark the corrected paths
hint: with 'git add <paths>' or 'git rm <paths>'
hint: and commit the result with 'git commit'

有衝突要合併

衝突的內容如下

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width">
    <title>My Page</title>
</head>
<body>
    <h1>momo's page lala edit</h1>
    <div>learning git</div>
    <div>change remote url</div>
    <div>prepare</div>
    <div>use the rebase</div>
    <div>deBug deBug deBug</div>
    <div>cr1-1</div>
<<<<<<< HEAD
=======
    <div>cr1-2</div>
    <div>cr1-3</div>
>>>>>>> fb808b6... cr1-3
</body>
</html>

合併後應該是只會留下cr1-1以及cr1-3所做的異動

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width">
    <title>My Page</title>
</head>
<body>
    <h1>momo's page lala edit</h1>
    <div>learning git</div>
    <div>change remote url</div>
    <div>prepare</div>
    <div>use the rebase</div>
    <div>deBug deBug deBug</div>
    <div>cr1-1</div>
    <div>cr1-3</div>
</body>
</html>

衝突合併後就commit

​$ git commit
[uat b245190] cr1-3
 Date: Thu Dec 29 23:48:06 2016 +0800
 1 file changed, 1 insertion(+)

此時index.html內就是客戶要的cr1-1加上cr1-3的版本

線圖如下

Imgur

可以看到分支uat內,後面兩個commit就是我們利用cherry-pick指令撿回來的異動資料

這樣一來就可以對客戶交代了

git-cherry-pick 官方文件


上一篇
git revert 指令簡介
下一篇
練習時做錯了怎麼辦?git reflog
系列文
Git學習筆記31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言